desc:ReaCliper 4x V 0.2
//V 0.1 Begin
//V 0.2 Added additional clipper after downsampling

slider1:gain_db=0<-20,20,0.001>Input Gain (dB)
slider2:knee=1.5<0,10,0.0001>Knee (dB)
slider3:clip=-0.2<-10,0,0.001>Ceil (dB)

import st-oversampler.jsfx-inc

in_pin:left input
in_pin:right input
out_pin:left output
out_pin:right output

@init
last_gain=10^(gain_db/20);

                
function Clip(in,kne,gain_db,clip)  (
                        indb=20*log10(abs(in))+gain_db-clip; 
                        outdb=indb;
                        indb      > kne/2    ?   outdb=0;
                        abs(indb) < kne/2    ?   outdb=-((indb-kne/2)^2)/2/kne;
                        outdb=outdb+clip;
                        out=sign(in)*10^(outdb/20);
                        //out=in;
                        );

@slider
cei=10^(clip/20);


@block


@sample

s0 = spl0;
s1 = spl1;

os0.os_up4(s0);
os1.os_up4(s1);

os0.y3 = Clip(os0.y3,knee,gain_db,clip);
os0.y2 = Clip(os0.y2,knee,gain_db,clip);
os0.y1 = Clip(os0.y1,knee,gain_db,clip);
os0.y0 = Clip(os0.y0,knee,gain_db,clip);
s0 = os0.os_down4();

os1.y3 = Clip(os1.y3,knee,gain_db,clip);
os1.y2 = Clip(os1.y2,knee,gain_db,clip);
os1.y1 = Clip(os1.y1,knee,gain_db,clip);
os1.y0 = Clip(os1.y0,knee,gain_db,clip);
s1 = os1.os_down4();

spl0 = max(-cei,min(cei,s0));
spl1 = max(-cei,min(cei,s1));
